package main

import "fmt"

func main() {
	n := 3
	redEdges := [][]int{{0, 1}}
	blueEdges := [][]int{{0, 1}}

	g := [2][][]int{}
	for i := range g { // 创建存放临时数据的容器
		/*
			[
				// 红
				[
					[], [], []
				],
				// 绿
				[
					[], [], []
				]
			]
		*/
		g[i] = make([][]int, n)
	}
	for _, e := range redEdges {
		g[0][e[0]] = append(g[0][e[0]], e[1])
	}
	for _, e := range blueEdges {
		g[1][e[0]] = append(g[1][e[0]], e[1])
	}
	type pair struct{ i, c int }
	q := []pair{pair{0, 0}, pair{0, 1}} // q 是 一个队列 里面存储 红绿红绿 或 绿红绿红 由c来控制
	ans := make([]int, n)
	vis := make([][2]bool, n)
	for i := range ans {
		ans[i] = -1
	}
	d := 0
	fmt.Println("ans:", ans)
	fmt.Println("=======================")
	for len(q) > 0 {
		for k := len(q); k > 0; k-- { // 遍历2遍 用来判断 红绿 是否都能到达 指定点位
			p := q[0]
			//fmt.Println("p:", p)
			q = q[1:]
			//fmt.Println("q:", q)
			i, c := p.i, p.c  // i:为当前位置    c: 红或绿
			if ans[i] == -1 { // 防止重复 写入
				ans[i] = d
			}
			vis[i][c] = true // 红或绿 能走
			fmt.Println(vis)
			c ^= 1
			fmt.Println("g:", g)
			for _, j := range g[c][i] { // 在当前位置 换一个颜色来走      c:红或绿  i:当前位置  j:目标位置		遍历 查看当前位置 到 可以达到的任意一个位置
				if !vis[j][c] { // vis[j][c] 目标位置 红或绿 是否能走
					q = append(q, pair{j, c}) // j:要去的位置  c:红或绿
				}
			}
			fmt.Println("ans:", ans)
		}
		d++
		fmt.Println("q:", q)
		fmt.Println("=======================")
	}
	fmt.Println(ans)
}
